STAT(2) | System calls | STAT(2) |
이름¶
stat, fstat, lstat - 파일 상태를 얻는다
사용법¶
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *file_name, struct stat
*buf);
int fstat(int filedes, struct stat *buf);
int lstat(const char *file_name, struct stat
*buf);
설명¶
이 함수는 지정된 파일에 대한 정보를 반환한다. 이 정보를 얻기 위해 필요한 접근 권한은 없지만, 파일을 읽는 경로에 있는 모든 디렉토리에 대한 탐색 권한이 필요하다.
stat 는 file_name 으로 지정된 파일에 대해 설명하고 buf 에 채운다. lstat 는 stat 와 동일시된다.링크는 그 자체로 설명된다, 링크에 포함되어 있는 파일을 설명하지 않는다.
fstat 는 stat와 동일시된다. file_name. 대신에 filedes 에 의해 지정된 열린 파일만 ( open(2) 에 의해 반환되듯이) 설명된다.
그것들은 모두 아래 영역을 포함하는 stat 구조을 반환한다:
struct stat {
dev_t st_dev; /* device */
ino_t st_ino; /* inode */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device type (if inode device) */
off_t st_size; /* total size, in bytes */
unsigned long st_blksize; /* blocksize for filesystem I/O */
unsigned long st_blocks; /* number of blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last change */ };
The value st_blocks 값은 512-bytes 블록에 있는 파일의 크기를 준다. st_blksize 값은 효율적인 파일 시스템 I/O를 위해 "선택된" 블록 크기를 준다. (더 작은 공간에 파일을 쓰는 것은 쓰고-수정하고-다시 쓰는데 비효율적이다.)4
모든 리눅스 파일시스템이 모든 시간 영역에서 실행하는 것은 아니다. 전통적으로, st_atime 는 mknod(2), utime(2), read(2), write(2),와 truncate(2). 로 바뀌었다. 전통적으로, st_mtime 는 mknod(2), utime(2),와 write(2). 로 바뀌었다. st_mtime 는 소유자, 그룹, 하드링크 카운트, 혹은 모드의 변화에 따라 바뀌지 않았다.
전통적으로, st_ctime 는 inode 정보를 쓰거나 설정함으로써 바뀌었다.(i.e., owner, group,link count, mode,등등).
아래 POSIX 매크로는 파일 타입을 확인하는 것이다:
- S_ISLNK(m)
- is it a symbolic link?
- S_ISREG(m)
- regular file?
- S_ISDIR(m)
- directory?
- S_ISCHR(m)
- character device?
- S_ISBLK(m)
- block device?
- S_ISFIFO(m)
- fifo?
- S_ISSOCK(m)
- socket?
아래 flag는 st_mode 영역을 위해 정의된 것이다:
S_IFMT | 0170000 | bitmask for the file type bitfields |
S_IFSOCK | 0140000 | socket |
S_IFLNK | 0120000 | symbolic link |
S_IFREG | 0100000 | regular file |
S_IFBLK | 0060000 | block device |
S_IFDIR | 0040000 | directory |
S_IFCHR | 0020000 | character device |
S_IFIFO | 0010000 | fifo |
S_ISUID | 0004000 | set UID bit |
S_ISGID | 0002000 | set GID bit (see below) |
S_ISVTX | 0001000 | sticky bit (see below) |
S_IRWXU | 00700 | mask for file owner permissions |
S_IRUSR | 00400 | owner has read permission |
S_IWUSR | 00200 | owner has write permission |
S_IXUSR | 00100 | owner has execute permission |
S_IRWXG | 00070 | mask for group permissions |
S_IRGRP | 00040 | group has read permission |
S_IWGRP | 00020 | group has write permission |
S_IXGRP | 00010 | group has execute permission |
S_IRWXO | 00007 | mask for permissions for others (not in group) |
S_IROTH | 00004 | others have read permission |
S_IWOTH | 00002 | others have write permisson |
S_IXOTH | 00001 | others have execute permission |
GID 비트 (S_ISGID)설정은 몇가지 특별한 이용법이 있다: 디렉토리의 경우 BSD semantic이 쓰이고 있음이 나타난다: 생성된 파일은 생성 프로세스와 생성된 디렉토리의 유효한 gid로부터가 아니라 디렉토리로부터 그들의 그룹 ID를 상속받는다. 그리고 S_ISGID 비트군을 가진다. 실행 비트(S_IXGRP)군을 갖지 않은 파일의 경우, mandatory file/record locking을 나타낸다.
디렉토리 상의 `sticky' bit (S_ISVTX)는 디렉토리안의 파일이 파일의 소유자, 디렉토리의 소유자, 그리고 루트에 의해 이름을 바뀌거나 지워질 수 있다는 것을 뜻한다.
반환값¶
성공시, 0이 반환되고, 실패시, -1이 반환된다. 그리고 errno 는 적절한 값으로 설정된다.
에러¶
호환¶
stat 와 fstat 호출은 SVr4, SVID, POSIX, X/OPEN, BSD 4.3에 따른다. lstat 호출은 4.3BSD and SVr4에 따른다. SVr4는 추가적으로 documents additional fstat 에러 상태인 EINTR, ENOLINK, EOVERFLOW를 문서화했다. SVr4 는 추가적으로 stat 와 lstat 의 에러인 EACCES, EINTR, EMULTIHOP, ENOLINK, EOVERFLOW를 문서화했다. st_blocks 와 st_blksize 필드의 사용은 이식될 수 없다. (그것들은 POSIX에의해 지정된것이 아니고 BSD에서 소개되었다. 해석은 시스템마다 다르고, 싱글 시스템에서 NFS가 마운트되면 복잡해진다.)
POSIX은 S_IFMT, S_IFSOCK, S_IFLNK, S_IFREG, S_IFBLK, S_IFDIR, S_IFCHR, S_IFIFO, S_ISVTX 비트에 대해 설명하지 않지만, 대신 S_ISDIR()등의 매크로 사용은 요구한다. 유닉스 V7 (이나 후의 시스템)은 POSIX에서 규정한 유사어인 S_IRUSR, S_IWUSR, S_IXUSR 의 S_IREAD, S_IWRITE, S_IEXEC를 갖는다.
타 시스템¶
다양한 시스템에서 사용되는 값들:
hex | 이름 | ls | octal | 설명 |
f000 | S_IFMT | 170000 | 파일타입을 위한 mask | |
0000 | 000000 | SCO out-of-service inode, BSD unknown type | ||
SVID-v2 and XPG2 have both 0 and 0100000 for ordinary file | ||||
1000 | S_IFIFO | p| | 010000 | fifo (named pipe) |
2000 | S_IFCHR | c | 020000 | character special (V7) |
3000 | S_IFMPC | 030000 | multiplexed character special (V7) | |
4000 | S_IFDIR | d/ | 040000 | directory (V7) |
5000 | S_IFNAM | 050000 | XENIX named special file | |
with two subtypes, distinguished by st_rdev values 1, 2: | ||||
0001 | S_INSEM | s | 000001 | XENIX semaphore subtype of IFNAM |
0002 | S_INSHD | m | 000002 | XENIX shared data subtype of IFNAM |
6000 | S_IFBLK | b | 060000 | block special (V7) |
7000 | S_IFMPB | 070000 | multiplexed block special (V7) | |
8000 | S_IFREG | - | 100000 | regular (V7) |
9000 | S_IFCMP | 110000 | VxFS compressed | |
9000 | S_IFNWK | n | 110000 | network special (HP-UX) |
a000 | S_IFLNK | l@ | 120000 | symbolic link (BSD) |
b000 | S_IFSHAD | 130000 | Solaris shadow inode for ACL (not seen by userspace) | |
c000 | S_IFSOCK | s= | 140000 | socket (BSD; also "S_IFSOC" on VxFS) |
d000 | S_IFDOOR | D | 150000 | Solaris door |
e000 | S_IFWHT | w% | 160000 | BSD whiteout (not used for inode) |
0200 | S_ISVTX | 001000 | `sticky bit': save swapped text even after use (V7) | |
reserved (SVID-v2) | ||||
On non-directories: don't cache this file (SunOS) | ||||
On directories: restricted deletion flag (SVID-v4.2) | ||||
0400 | S_ISGID | 002000 | set group ID on execution (V7) | |
for directories: use BSD semantics for propagation of gid | ||||
0400 | S_ENFMT | 002000 | SysV file locking enforcement (shared w/ S_ISGID) | |
0800 | S_ISUID | 004000 | set user ID on execution (V7) | |
0800 | S_CDF | 004000 | directory is a context dependent file (HP-UX) |
sticky 명령은 AT&T UNIX V32에서 선보였다.
관련 항목¶
May 13, 1998 | Linux |